#include "UiManager.h"

#include <QDebug>
#include <unistd.h>

#include "elog.h"
#define TAG "UiManager"
#define LOGI(...)   elog_i(TAG,__VA_ARGS__)

UiManager UiManager::_uiManager;

/**
 * @brief 启动UiManager
 * @return 0:成功 1:失败
 * @note 这个方法暴露给qml，由qml加载完成后调用
 * @author NanoPangBZ
*/
int UiManager::start()
{
    LOGI("start.");
    windowsTitle = QString("NanoCAN");
    versionString = QString("v0.0.0.1");
    connectStateLabel = QString("未连接");
    serialRecieve = QString("");

    emit _uiManager.titleNameChanged();
    emit _uiManager.connectStateLabelChanged();
    emit _uiManager.serialRecieveChanged();

    _thread = new std::thread(&UiManager::_backendThreadFunc,this);

    return 0;
}

/**
 * @brief 启动相关服务
 * @return 0:成功 1:失败
 * @note 这个方法暴露给qml，由qml加载完成后调用，以此加载其他没有继承Qobject的业务逻辑
 * @author NanoPangBZ
*/
int UiManager::serviceStart()
{
    return 0;
}

/**
 * @brief 打开CanDebug的通讯IO
 * @return 0:成功 1:失败
 * @note 这个方法暴露给qml，当用户触发打开命令时调用后台
 * @author NanoPangBZ
*/
int UiManager::openCanDebugPort()
{
    return 0;
}

/**
 * @brief 请求更新Ui
 * @return 0:成功 1:失败
 * @note 这个方法暴露给qml，由qml主动申请更新Ui
 * @author NanoPangBZ
*/
int UiManager::refreshUi()
{
    return 0;
}

/**
 * @brief 获取UiManager的实例
 * @return UiManager实例指针
 * @note 这个方法用于获取实例，并将其加入Ui引擎的上下文中，实现C++/Qml混合编程
 * @author NanoPangBZ
*/
UiManager* UiManager::getInstance()
{
    return &_uiManager;
}

/**
 * @brief 获取后台缓存的串口接收(字符串，由其它接口控制显示方式)
 * @return UiManager实例指针
 * @note 这个方法用于获取实例，并将其加入Ui引擎的上下文中，实现C++/Qml混合编程
 * @author NanoPangBZ
*/
QString UiManager::getSerialRecieve()
{
    return serialRecieve;
}

UiManager::UiManager()
{
    windowsTitle = "unkonw";       //窗口标题名
    versionString = "unkonw";      //版本字符串
    connectStateLabel = "unkonw";  //连接状态标签
    serialRecieve = "unkonw";
    _thread = NULL;
}

UiManager::~UiManager()
{

}

QString UiManager::getTitleName()
{
    return windowsTitle;
}

QString UiManager::getConnectStateLabel()
{
    return connectStateLabel;
}

void UiManager::_backendThreadFunc(void)
{
    elog_i(TAG,"Enter ui manager backend thread function.");
    while (1) {

        usleep( 10 * 1000 );
    }
}
